package main

import "fmt"

// 1.二进制的最高位是符号位：0正数 1负数
// 2.原码  反码 补码
// 2.1 正数:原码 反码 补码 都一样
// 2.2 负数：
// 2.2.1负数的反码:  它的原码【符号位】不变，其他位取反  0->1 1->0
// 2.2.2负数的补码：它的反码+1
// 2.3 0的反码/补码都是0
func main() {

	// 正数位移：左移n位 低位补0，右移n位，高位补0
	// 负数位移：左移n位 低位补0，右移n位，高位补1

	//左移 ，低位补0
	//右移 ，高位补充符号位
	//移动操作都是在补码的基础上进行的~，操作完成后要恢复原码：补码-1 = 反码，反码符号位不便，其他位取反
	//反码：符号位不变，其他位取反
	//补码：反码+1

	var a int = 1 >> 2    //位右移
	fmt.Printf("%d\n", a) //0

	var b int = 1 << 2
	fmt.Printf("%d\n", b) //4

	var c int = -1 >> 2
	fmt.Printf("%d\n", c) //-1

	var d int = -1 << 2
	fmt.Printf("%d\n", d) //-4

	// & 均为1才为1
	fmt.Printf("%d\n", 2&3) //2
	//0010
	//0011
	//0010 =2

	// | 有1则为1
	fmt.Printf("%d\n", 2|3) //3
	//0010
	//0011
	//0011 =3

	// ^ 相同则为0
	fmt.Printf("%d\n", 2^3) //1
	//0010
	//0011
	//0001 =1

}
